#include<iostream>
#include <unistd.h>
#include <fcntl.h>
#include<cstdio>
//0是标准输入，默认就是阻塞的
void SerNonBlock(int fd)
{
    int fl=fcntl(fd,F_GETFL);//对传进来的文件描述符，获取该文件structfile对应的标志位
    if(fl<0)//说明打开失败了
    {
        perror("fcntl");
        return ;
    }
    //走到这里说明我们已经将该fd的文件标志位获取成功了
    fcntl(fd,F_SETFL,fl|O_NONBLOCK);//再次进行调用fcntl，给这个文件设置一个新的标志位
    //O_NONBLOCK将fd设置为非阻塞模式
}


int main()
{
    SerNonBlock(0);//将0号文件描述符设置为非阻塞的
    char buffer[1024];
    while(true)
    {
        ssize_t n=read(0, buffer, sizeof(buffer));//从标准输入0中进行读取，读到buffer中，期望读取大小是sizeof(buffer)
        if(n>0)//说明读成功了，读取的字数是n个
        {
            buffer[n-1 ]=0;//
            std::cout<<buffer<<std::endl;//输入什么我打印什么
        }
        else if(n<0)//对返回值进行判断操作
        {
            //下面我们需要对错误码进行判断操作

            //1、读取出错2、底层没有数据准备好,不算是出错，
            if(errno==EAGAIN||errno==EWOULDBLOCK)//退出时的错误码
            {
                std::cout<<"数据没有准备好"<<std::endl;
                sleep(1);
            }
            else if(errno==EINTR)//读的过程中被打断了
            {
                continue;//重新读取数据
            }
            else
            {
                //真正的read出错了
            }
        }
        else
        {
            break;
        }
    }
    return 0;
}